/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package lk;

import java.util.ArrayList;

/**
 *
 * @author apple
 */
public class VueloXRuta {
    public Vuelo vuelo;
    public Ruta ruta;


    public VueloXRuta(Ruta ruta, Vuelo vuelo){
        this.ruta = ruta;
        this.vuelo = vuelo;
    }

    public VueloXRuta(){
    }
    
    public VueloXRuta get(Ruta rut){
        VueloXRuta vuelos = new VueloXRuta();
        return vuelos;
    }  
    
    public ArrayList<Vuelo> get(Ruta rut, int i, int opt){
        /*Devuelve los vuelos de la ruta hasta i*/
        /*Debe tomar NECESARIAMENTE OPT VUELOS si esta al final ya debería parar*/
        if(i > rut.vuelos.size()-opt) return null;
        ArrayList<Vuelo> vuelos = new ArrayList<Vuelo>();
        for(int j=0; j<opt; j++){
            vuelos.add(rut.vuelos.get(i));
            i++;
            if (i==rut.vuelos.size())
                break;
        }
        return vuelos;
    }
    
    public void agregar(Vuelo origen, Vuelo destino, ArrayList<ArrayList<Vuelo>> vuelosY, ArrayList<ArrayList<Vuelo>>auxY){
        ArrayList<Vuelo> aux = new ArrayList<Vuelo>();
        
        for(int i=0; i<auxY.size(); i++){
            aux.add(origen);
            for(int j=0; j<auxY.get(i).size(); j++){
                aux.add(auxY.get(i).get(j));
                System.out.println("origen: " + auxY.get(i).get(j).destino.idAlmacen + " destino: " + auxY.get(i).get(j).origen.idAlmacen);
            }
            aux.add(destino);
            vuelosY.add(aux);
            aux.clear();
        }
    }
    
    public ArrayList<ArrayList<Vuelo>> getY(ArrayList<Vuelo> vuelos, int opt, Almacen origen, Almacen destino, Fecha fechaSalida, Fecha fechaLlegada){
        ArrayList<Vuelo> vueloY = new ArrayList<Vuelo>();
        ArrayList<ArrayList<Vuelo>> vuelosY = new ArrayList<ArrayList<Vuelo>>();
        ArrayList<ArrayList<Vuelo>> auxY = new ArrayList<ArrayList<Vuelo>>();
        ArrayList<Vuelo> vueloOrigen = new ArrayList<Vuelo>();
        ArrayList<Vuelo> vueloDestino = new ArrayList<Vuelo>();
        
        
        /*Busco todos los vuelos origen que coinciden con origen de vueloX*/
        //revisión de fecha pendiente --Carlos
        //MAL no está tomando en cuenta la fecha límite según la fecha de creación
        for(int i=0;i<vuelos.size(); i++){            
            if(vuelos.get(i).origen.same(origen)
                    && fechaSalida.esMenorQue(vuelos.get(i).fechaSalida) 
                    && vuelos.get(i).fechaLlegada.esMenorQue(fechaLlegada) )
                vueloOrigen.add(vuelos.get(i));
        }

        /*Busco todos los vuelos destino que coinciden con destino de vueloX*/
        //revisión de fecha pendiente --Carlos
        //MAL no está tomando en cuenta la fecha límite según la fecha de creación
        for(int i=0; i<vuelos.size(); i++){            
            if(vuelos.get(i).destino.same(destino) 
                    && fechaSalida.esMenorQue(vuelos.get(i).fechaSalida)
                    && vuelos.get(i).fechaLlegada.esMenorQue(fechaLlegada))
                vueloDestino.add(vuelos.get(i));
        }

        //revisión de fecha pendiente --Carlos
        if (opt == 1){      
            for(int j=0; j<vueloOrigen.size(); j++){
                if(vueloOrigen.get(j).destino.same(destino))
                    vueloY.add(vueloOrigen.get(j));
                if(!vueloY.isEmpty()) 
                    vuelosY.add((ArrayList<Vuelo>)vueloY.clone());
                vueloY.clear();
            }
        }
        else { 
            if (opt == 2){
                //System.out.println("MAXj: " + vueloOrigen.size() + " MAXk: " + vueloDestino.size());
                for(int j=0; j<vueloOrigen.size(); j++){
                    for(int k=0; k<vueloDestino.size(); k++){
                        //revisión de fechas pendiente --Carlos
                        if(vueloOrigen.get(j).destino.same(vueloDestino.get(k).origen) 
                                && vueloOrigen.get(j).fechaLlegada.esMenorQue(vueloDestino.get(k).fechaSalida)){
                            vueloY.add(vueloOrigen.get(j));
                            vueloY.add(vueloDestino.get(k));
                        }
                        if(!vueloY.isEmpty()) 
                            vuelosY.add((ArrayList<Vuelo>)vueloY.clone());
                        vueloY.clear();
                        //System.out.println("j: " + j + " k: " + k);
                    }

                }
            }
            else{  
                for(int j=0; j<vueloOrigen.size(); j++){
                    for(int k=0; k<vueloDestino.size(); k++){
                        if(vueloOrigen.get(j).fechaLlegada.esMenorQue(vueloDestino.get(k).fechaSalida)){
//                            System.out.println("origen: " + vueloOrigen.get(j).destino.idAlmacen + " destino: " + vueloDestino.get(k).origen.idAlmacen);
//                            System.out.println("fi: " +  vueloOrigen.get(j).fechaLlegada.aString() + " ff: " + vueloDestino.get(k).fechaSalida.aString());
                            auxY = getY(vuelos, opt-2, vueloOrigen.get(j).destino, vueloDestino.get(k).origen, vueloOrigen.get(j).fechaLlegada, vueloDestino.get(k).fechaSalida);
//                            for (int i = 0; i < auxY.size(); i++)
//                                System.out.println("***************AUXY************");
                            agregar(vueloOrigen.get(j), vueloDestino.get(k), vuelosY, auxY);
                        }
                    }
                }
            }
        }
        
        return vuelosY;
        
    }
    
    public ArrayList<ArrayList<Vuelo>> getRandom(ArrayList<Vuelo> vuelos, ArrayList<Vuelo> vueloX, int opt, 
            Fecha fechaSalida, Fecha fechaLlegada){
        /*Devuelve todos los vuelos disponibles menos los de la ruta*/  

        ArrayList<Vuelo> vuelosU = new ArrayList<Vuelo>();
        vuelosU = (ArrayList<Vuelo>)vuelos.clone();
        ArrayList<ArrayList<Vuelo>> vuelosY = new ArrayList<ArrayList<Vuelo>>();
        ArrayList<ArrayList<Vuelo>> vueloY = new ArrayList<ArrayList<Vuelo>>();
               
        for(int i=0; i<vueloX.size(); i++) 
            vuelosU.remove(vueloX.get(i));
          
        for(int i=0; i<opt; i++){
            vueloY = getY(vuelosU, i+1, vueloX.get(0).origen, vueloX.get(vueloX.size() - 1).destino, fechaSalida, fechaLlegada);
            for(int j=0; j<vueloY.size(); j++) 
                vuelosY.add(vueloY.get(j));  
        }

        
        return vuelosY;
    }
    
    public int Cantidad(Ruta rut){
        return rut.vuelos.size();
    }
    
    public Ruta Reemplazar(Ruta rut, ArrayList<Vuelo> vueloX, ArrayList<Vuelo> vueloY){
        ruta = new Ruta();
        int i, j=0;
        
        for(i=0; i< rut.vuelos.size(); i++){
            if (rut.vuelos.get(i).equals(vueloX.get(j))) break;
            ruta.vuelos.add(rut.vuelos.get(i));
        }
            
        for(j=0; j<vueloY.size(); j++){
            ruta.vuelos.add(vueloY.get(j));
            i++;
        }
            
        for(;i< rut.vuelos.size(); i++){
            ruta.vuelos.add(rut.vuelos.get(i));
        }
        
        return ruta;
    }
}
